package com.example.mulittenantdemo.util;

import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;

@Data
@NoArgsConstructor
@AllArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
public class Result<T> implements Serializable {

    /**
     * 状态码，通常为 HTTP 状态码或自定义业务状态码。
     */
    private int code;

    /**
     * 消息，用于描述响应的状态或结果。
     */
    private String message;

    /**
     * 响应数据，可以是任意类型，具体取决于业务需求。
     */
    private T data;

    /**
     * 创建一个成功的响应对象，状态码设为 200，消息为 "success"，并包含指定的数据。
     *
     * @param data 响应数据
     * @param <T>  数据类型
     * @return 通用响应对象
     */
    public static <T> Result<T> success(T data) {
        return new Result<>(200, "success", data);
    }

    /**
     * 创建一个失败的响应对象，状态码设为 400，消息为 "failure"，并包含指定的消息和数据。
     *
     * @param message 错误消息
     * @param data    响应数据（可选）
     * @param <T>     数据类型
     * @return 通用响应对象
     */
    public static <T> Result<T> failure(String message, T data) {
        return new Result<>(400, message, data);
    }

    /**
     * 创建一个失败的响应对象，状态码设为 400，消息为 "failure"，不包含数据。
     *
     * @return 通用响应对象
     */
    public static Result<Void> failure() {
        return failure("failure", null);
    }

    public int getCode() {
        return code;
    }
}
